GitHubのデフォルトブランチを変更するときは既存のPull RequestのBaseブランチも忘れずに変更する(GitHub CLI)
こんにちは、CX事業本部 IoT事業部の若槻です。
GitHubの新規Repositoryのデフォルトブランチの名前はかつてmaster
でしたが、2020/10よりmain
に変更されました。
私はこのアップデート後もしばらくの間は、アップデート以前に作成したRepositoryはブランチ名をmaster
のまま使い続けていましたが、最近になって既定でmain
で作成されたRepositoryがほとんどを占めて来たため、すべてのRepositoryでmain
に統一したくなりました。
そこでmaster
のままになっているRepositoryのデフォルトブランチをmain
に変更する操作を行ったのですが、その際に既存のPull RequestのBaseブランチを忘れずに変更する必要があったので、対処内容を書き残しておきます。
デフォルトブランチをmainに変更
ローカルのブランチ名をmaster
からmain
に変更してリモートにPushします。
git branch -m master main git push -u origin main
次にGitHub側のBranchesでデフォルトブランチをmain
に変更します。
あとはリモートからmaster
ブランチを削除すれば変更は完了なのですが、master
をBaseブランチとしているPull Requestが残っているので、master
を削除するとPull Requestは自動でクローズされるという警告が表示されます。
勝手にクローズされては困りますし、(いずれにせよ対応としては必要なので)master
を削除する前に既存のPull RequestのBaseブランチをmain
に変更します。
既存のPull RequestのBaseをmainに変更
Open中のPull Requestの数が結構あるので、Baseブランチの変更はGitHub CLIを使って行います。
$ gh --version gh version 2.14.4 (2022-08-10) https://github.com/cli/cli/releases/tag/v2.14.4
gh pr listでPull Request一覧を出力してみると、master
をBaseとしたものが20近く残っていますね。これらをGUIから一つずつ変更するのは大変なのでCLIで対応しましょう。
$ gh pr list --json number,baseRefName --jq '.[]' {"baseRefName":"main","number":1612} {"baseRefName":"main","number":1608} {"baseRefName":"master","number":1602} {"baseRefName":"master","number":1599} {"baseRefName":"master","number":1598} {"baseRefName":"master","number":1590} {"baseRefName":"master","number":1557} {"baseRefName":"master","number":1553} {"baseRefName":"master","number":1540} {"baseRefName":"master","number":1535} {"baseRefName":"master","number":1531} {"baseRefName":"master","number":1529} {"baseRefName":"master","number":1526} {"baseRefName":"master","number":1524} {"baseRefName":"master","number":1521} {"baseRefName":"master","number":1513} {"baseRefName":"master","number":1477} {"baseRefName":"master","number":1440} {"baseRefName":"master","number":1433} {"baseRefName":"master","number":1430} {"baseRefName":"master","number":1416}
--jq
オプションではjqのクエリが使用できます。select
クエリを使えばbaseRefName
がmaster
であるPull request一覧を取得できます。
$ gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .' {"baseRefName":"master","number":1602} {"baseRefName":"master","number":1599} {"baseRefName":"master","number":1598} {"baseRefName":"master","number":1590} {"baseRefName":"master","number":1557} {"baseRefName":"master","number":1553} {"baseRefName":"master","number":1540} {"baseRefName":"master","number":1535} {"baseRefName":"master","number":1531} {"baseRefName":"master","number":1529} {"baseRefName":"master","number":1526} {"baseRefName":"master","number":1524} {"baseRefName":"master","number":1521} {"baseRefName":"master","number":1513} {"baseRefName":"master","number":1477} {"baseRefName":"master","number":1440} {"baseRefName":"master","number":1433} {"baseRefName":"master","number":1430} {"baseRefName":"master","number":1416}
Baseブランチがmaster
のPull RequestのNumber一覧を改行区切りで取得します。
$ pulls=$(gh pr list --json number,baseRefName --jq '.[] | select(.baseRefName == "master") | .number') $ echo $pulls 1602 1599 1598 1590 1557 1553 1540 1535 1531 1529 1526 1524 1521 1513 1477 1440 1433 1430 1416
各Numberに対してgh pr editを実行し、Baseブランチをmain
に変更します。
echo $pulls | while read line do gh pr edit $line --base main done
再度Pull Request一覧を出力してみると、すべてでBaseブランチがmain
に変更できていますね!
$ gh pr list --json number,baseRefName --jq '.[]' {"baseRefName":"main","number":1612} {"baseRefName":"main","number":1608} {"baseRefName":"main","number":1602} {"baseRefName":"main","number":1599} {"baseRefName":"main","number":1598} {"baseRefName":"main","number":1590} {"baseRefName":"main","number":1557} {"baseRefName":"main","number":1553} {"baseRefName":"main","number":1540} {"baseRefName":"main","number":1535} {"baseRefName":"main","number":1531} {"baseRefName":"main","number":1529} {"baseRefName":"main","number":1526} {"baseRefName":"main","number":1524} {"baseRefName":"main","number":1521} {"baseRefName":"main","number":1513} {"baseRefName":"main","number":1477} {"baseRefName":"main","number":1440} {"baseRefName":"main","number":1433} {"baseRefName":"main","number":1430} {"baseRefName":"main","number":1416}
これによりmaster
ブランチが問題なく削除できるようになりました。
おわりに
GitHubのデフォルトブランチを変更するときは既存のPull requestのBaseブランチも忘れずに変更しようということで対応してみました。
個人的にはmaster
よりもmain
の方が文字数が少なくて打鍵もしやすいので気に入っています。
参考
- masterからmainに変更する(githubのリモート&ローカルブランチ)branches - Qiita
- jqを使って少し複雑な条件式でフィルタリングする方法をまとめてみた - Qiita
- 【bash】行ごとに処理する - Qiita
以上